﻿Imports System.Data.OleDb
Imports System.IO
Imports System.Runtime.InteropServices

Public Class E3_モデルデータ作成F
#Region "画面操作"

    ' クラスレベル変数はK1.vbで宣言
    Private 閉じる要求 As Boolean = False

    ' Windows API for keyboard state
    <DllImport("user32.dll")>
    Private Shared Function GetAsyncKeyState(ByVal vKey As Keys) As Short
    End Function

    Private Sub E3_モデルデータ作成F_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        著作L.Text = 著作
        ' フォームの初期設定のみ
        進行状況L.Text = "..."
    End Sub
    'Private Sub E3_モデルデータ作成F_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
    '    ' フォームが完全に表示されてから処理を開始

    'End Sub
    Private Sub E3_モデルデータ作成実行Bt_Click(sender As Object, e As EventArgs) Handles E3_モデルデータ作成実行Bt.Click
        Try
            進行読込()
        Catch ex As Exception
            MsgBox($"処理エラー: {ex.Message}{vbCrLf}{ex.StackTrace}", MsgBoxStyle.Critical)
            進行状況L.Text = "エラーが発生しました。"
        End Try
    End Sub
    Private Sub E3_閉じるBt_Click(sender As Object, e As EventArgs) Handles E3_閉じるBt.Click
        Dim result = MsgBox("フォームを閉じますか？",
                            MsgBoxStyle.Question Or MsgBoxStyle.YesNo, "閉じる確認")
        If result = DialogResult.Yes Then
            閉じる要求 = True
            モデルデータ設定F.Close()
            Me.Close()
        End If
    End Sub
    Private Sub データモデルDgv非表示Rb_CheckedChanged(sender As Object, e As EventArgs) Handles データモデルDgv非表示Rb.CheckedChanged, データモデルDgv表示Rb.CheckedChanged
        ' ラジオボタンの状態に応じてデータモデルDgvの表示/非表示を切り替え
        Try
            If データモデルDgv表示Rb.Checked Then
                ' T600_データモデルを表示
                T600_データモデル表示()
            Else
                ' 非表示
                データモデルDgv.DataSource = Nothing
                データモデルDgv.Visible = False
            End If
        Catch ex As Exception
            ' エラーが発生しても処理を継続（スルー）
        End Try
    End Sub
#End Region

#Region "E3_モデルデータ作成実行Btの処理"

#End Region
    Private Sub 進行読込()
        'T300_進行の読込、作成Chk=済が有ればスキップ
        Dim dbPath As String = Tera計算DataPath & "\EIQ分析AI化\EIQ_AIモデル.accdb"
        Dim connStr As String = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={dbPath};"

        Try
            ' まずT300_進行テーブルのデータを全て取得
            Dim 進行データリスト As New List(Of (進行連番 As Integer, E順位 As Integer, I順位 As Integer, E採用範囲 As Double, I採用範囲 As Double, 作成Chk As String))

            Using conn As New OleDbConnection(connStr)
                conn.Open()

                ' T300_進行テーブルから作成Chk <> "済"のデータを進行連番順に読み込む
                Dim sql As String = "SELECT * FROM T300_進行 WHERE 作成Chk <> '済' OR 作成Chk IS NULL ORDER BY 進行連番"
                Using cmd As New OleDbCommand(sql, conn)
                    Using reader As OleDbDataReader = cmd.ExecuteReader()
                        While reader.Read()
                            Dim データ = (
                                進行連番:=Convert.ToInt32(reader("進行連番")),
                                E順位:=Convert.ToInt32(reader("E順位")),
                                I順位:=Convert.ToInt32(reader("I順位")),
                                E採用範囲:=Convert.ToDouble(reader("E採用範囲")),
                                I採用範囲:=Convert.ToDouble(reader("I採用範囲")),
                                作成Chk:=If(IsDBNull(reader("作成Chk")), "", reader("作成Chk").ToString())
                            )
                            進行データリスト.Add(データ)
                        End While
                    End Using
                End Using
            End Using

            ' データが取得できたか確認
            If 進行データリスト.Count = 0 Then
                進行状況L.Text = "処理対象のレコードがありません。"
                進行状況L.Refresh()
                MsgBox("処理対象のレコードがありません。" & vbCrLf &
                      "全てのレコードが既に処理済みです。", MsgBoxStyle.Information, "処理対象なし")
                Exit Sub
            End If

            ' 各レコードを処理（SQLでフィルタ済みのため全て処理対象）
            Dim 処理件数 As Integer = 0
            Dim 全件数 As Integer = 進行データリスト.Count
            Dim 中断フラグ As Boolean = False

            For Each データ In 進行データリスト
                ' 閉じるボタンによる中断チェック
                If 閉じる要求 Then
                    中断フラグ = True
                    進行状況L.Text = $"閉じるボタンにより中断されました。({処理件数}/{全件数} 件完了)"
                    進行状況L.Refresh()
                    Exit For
                End If

                進行連番 = データ.進行連番
                E順位 = データ.E順位
                I順位 = データ.I順位
                E採用範囲 = データ.E採用範囲
                I採用範囲 = データ.I採用範囲

                Try
                    ' 処理開始メッセージ
                    進行状況L.Text = $"進行連番 {進行連番} の処理を開始します。 - Escキーで中断可能"
                    進行状況L.Refresh()
                    Application.DoEvents()

                    ' Escapeキーのチェック
                    If My.Computer.Keyboard.CtrlKeyDown = False AndAlso My.Computer.Keyboard.AltKeyDown = False AndAlso My.Computer.Keyboard.ShiftKeyDown = False Then
                        If GetAsyncKeyState(Keys.Escape) <> 0 Then
                            Dim result As DialogResult = MsgBox($"処理を中断しますか？{vbCrLf}{vbCrLf}現在の進行状況: {処理件数}/{全件数} 件完了{vbCrLf}{vbCrLf}「はい」: 処理を中断して終了します。{vbCrLf}「いいえ」: 処理を続行します。", MsgBoxStyle.Question Or MsgBoxStyle.YesNo, "処理の中断確認")
                            If result = DialogResult.Yes Then
                                中断フラグ = True
                                進行状況L.Text = $"処理が中断されました。({処理件数}/{全件数} 件完了)"
                                進行状況L.Refresh()
                                MsgBox($"処理を中断しました。{vbCrLf}{vbCrLf}完了件数: {処理件数}/{全件数}", MsgBoxStyle.Information, "処理中断")
                                Exit For
                            End If
                        End If
                    End If

                    T410テーブル作成()        ' T410テーブル新規作成

                    進行状況L.Text = $"進行連番 {進行連番}: T410テーブル作成完了。T500_計算対象を作成中... ({処理件数 + 1}/{全件数})"
                    進行状況L.Refresh()
                    Application.DoEvents()

                    T500_計算対象作成()       ' T500_計算対象作成
                    T600_データモデル作成()   ' T500_計算対象からデータモデル作成


                    ' 処理完了後、作成Chkを"済"に更新
                    Using conn As New OleDbConnection(connStr)
                        conn.Open()
                        Dim sqlUpdate As String = "UPDATE T300_進行 SET 作成Chk = ? WHERE 進行連番 = ?"
                        Using cmdUpdate As New OleDbCommand(sqlUpdate, conn)
                            cmdUpdate.Parameters.Add("@作成Chk", OleDbType.VarChar, 10).Value = "済"
                            cmdUpdate.Parameters.AddWithValue("@進行連番", 進行連番)
                            cmdUpdate.ExecuteNonQuery()
                        End Using
                    End Using

                    処理件数 += 1
                    進行状況L.Text = $"進行連番 {進行連番} の処理が完了しました。({処理件数}/{全件数})"
                    進行状況L.Refresh()
                    Application.DoEvents()

                    ' Accessが肥大化するため、一定件数ごとに最適化(Compact)を実行
                    Try
                        If 処理件数 > 0 AndAlso (処理件数 Mod 50) = 0 Then
                            進行状況L.Text = $"進行連番 {進行連番}: データベース最適化(Compact)を開始します... ({処理件数}/{全件数})"
                            進行状況L.Refresh()
                            Application.DoEvents()

                            ' GCで接続解放を促してからCompactを実行
                            GC.Collect()
                            GC.WaitForPendingFinalizers()

                            'CompactAccess(dbPath)

                            進行状況L.Text = $"進行連番 {進行連番}: データベース最適化(Compact)が完了しました。 ({処理件数}/{全件数})"
                            進行状況L.Refresh()
                            Application.DoEvents()
                        End If
                    Catch ex As Exception
                        ' 最適化に失敗しても処理は継続（ログ表示はせずスルー）
                    End Try

                Catch ex As Exception
                    MsgBox($"進行連番 {進行連番} の処理でエラー: {ex.Message}{vbCrLf}{ex.StackTrace}", MsgBoxStyle.Critical)
                    Exit Sub
                End Try
            Next

            If 中断フラグ Then
                ' 中断された場合は何もしない（既にメッセージ表示済み）
            ElseIf 処理件数 > 0 Then
                進行状況L.Text = $"モデルデータ作成が完了しました。処理件数: {処理件数}/{全件数}"
                進行状況L.Refresh()
                MsgBox($"モデルデータ作成が完了しました。{vbCrLf}処理件数: {処理件数}/{全件数}", MsgBoxStyle.Information)
                If 処理件数 = 全件数 Then
                    データモデル_csv作成()
                End If

            Else
                進行状況L.Text = "処理対象のレコードがありませんでした。"
                進行状況L.Refresh()
            End If


        Catch ex As Exception
            MsgBox($"進行読込エラー: {ex.Message}{vbCrLf}{ex.StackTrace}", MsgBoxStyle.Critical)
        End Try
    End Sub
    Private Sub データモデル_csv作成()
        ' T600_データモデルを「EIQ分析AI化」フォルダーにデータモデル.csvを新規保存
        Dim dbPath As String = Tera計算DataPath & "\EIQ分析AI化\EIQ_AIモデル.accdb"
        Dim connStr As String = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={dbPath};"

        Try
            Dim outDir As String = Tera計算DataPath & "\EIQ分析AI化"
            If Not Directory.Exists(outDir) Then
                Directory.CreateDirectory(outDir)
            End If

            Dim outPath As String = Path.Combine(outDir, "データモデル.csv")

            Using conn As New OleDbConnection(connStr)
                conn.Open()

                ' テーブル存在チェック
                Dim テーブル存在 As Boolean = False
                Dim schema As DataTable = conn.GetSchema("Tables")
                For Each row As DataRow In schema.Rows
                    If row("TABLE_NAME").ToString().ToUpper() = "T600_データモデル".ToUpper() Then
                        テーブル存在 = True
                        Exit For
                    End If
                Next

                If Not テーブル存在 Then
                    MsgBox("テーブル T600_データモデル が存在しません。", MsgBoxStyle.Exclamation)
                    Exit Sub
                End If

                Dim sql As String = "SELECT * FROM T600_データモデル ORDER BY モデル連番"
                Using cmd As New OleDbCommand(sql, conn)
                    Using reader As OleDbDataReader = cmd.ExecuteReader()
                        If reader Is Nothing Then
                            MsgBox("T600_データモデル のデータ取得に失敗しました。", MsgBoxStyle.Exclamation)
                            Exit Sub
                        End If

                        Using sw As New StreamWriter(outPath, False, System.Text.Encoding.UTF8)
                            ' ヘッダ行を書き込む
                            Dim colCount As Integer = reader.FieldCount
                            Dim headers As New List(Of String)
                            For i As Integer = 0 To colCount - 1
                                headers.Add(reader.GetName(i))
                            Next
                            sw.WriteLine(String.Join(vbTab, headers))

                            ' データ行を書き込む
                            While reader.Read()
                                Dim fields As New List(Of String)
                                For i As Integer = 0 To colCount - 1
                                    Dim val As String = If(IsDBNull(reader(i)), "", reader(i).ToString())
                                    ' タブや改行をスペースに変換してCSV崩れを防ぐ
                                    val = val.Replace(vbTab, " ").Replace(vbCr, " ").Replace(vbLf, " ")
                                    fields.Add(val)
                                Next
                                sw.WriteLine(String.Join(vbTab, fields))
                            End While
                        End Using
                    End Using
                End Using
            End Using

            MsgBox($"データモデル.csvを保存しました。{vbCrLf}{outPath}", MsgBoxStyle.Information)

        Catch ex As Exception
            MsgBox($"データモデル_csv作成エラー: {ex.Message}{vbCrLf}{ex.StackTrace}", MsgBoxStyle.Critical)
        End Try
    End Sub

#Region " T410テーブル"
    Sub T410テーブル作成()
        ' T500_計算対象作成のためのテーブル()
        'seed1 = 12345 seed2 = 22345（KI.vbで設定済み）

        ' E判定テーブル作成（出荷先名の取込も含む）
        If E採用範囲 <= 1 Then
            T410テーブル作成1("T410_E判定", 正規出荷先数, seed1)
        Else
            T410テーブル作成2("T410_E判定", 正規出荷先数, seed1)
        End If

        ' I判定テーブル作成（アイテムの取込も含む）
        If I採用範囲 <= 1 Then
            T410テーブル作成1("T410_I判定", 正規アイテム数, seed2)
        Else
            T410テーブル作成2("T410_I判定", 正規アイテム数, seed2)
        End If
    End Sub
    Sub T410テーブル作成1(e As String, レコード As Integer, seed1 As Integer)
        ' データベースパス
        Dim dbPath As String = Tera計算DataPath & "\EIQ分析AI化\EIQ_AIモデル.accdb"
        Dim connStr As String = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={dbPath};"

        ' 固定のシード値
        Dim seed As Integer = seed1
        Dim rnd As New Random(seed) ' VB.NET_SIDEで乱数生成

        ' テーブル名から区分を判定
        Dim 区分 As String = If(e.Contains("_E"), "E", "I")

        ' 採用範囲を取得
        Dim 採用範囲 As Double = If(区分 = "E", E採用範囲, I採用範囲)

        Using conn As New OleDbConnection(connStr)
            Try
                conn.Open()

                ' 1. 既存テーブルがあれば削除（引数のテーブル名を使用）
                Using cmdDrop As New OleDbCommand($"DROP TABLE {e}", conn)
                    Try
                        cmdDrop.ExecuteNonQuery()
                    Catch
                        ' テーブルが存在しない場合は無視
                    End Try
                End Using

                ' 2. 新規テーブル作成（区分に応じたフィールドを設定）
                Dim createTableSql As String
                If 区分 = "E" Then
                    ' E判定：出荷先関連フィールド
                    createTableSql = $"CREATE TABLE {e} (" &
                        "順位 AUTOINCREMENT PRIMARY KEY, " &
                        "乱数 DOUBLE, " &
                        "判定 VARCHAR(10), " &
                        "出荷先名 VARCHAR(255))"
                    E採用範囲Chk = 1
                Else
                    ' I判定：アイテム関連フィールド
                    createTableSql = $"CREATE TABLE {e} (" &
                        "順位 AUTOINCREMENT PRIMARY KEY, " &
                        "乱数 DOUBLE, " &
                        "判定 VARCHAR(10), " &
                        "アイテム VARCHAR(255))"
                    I採用範囲Chk = 1
                End If

                Using cmdCreate As New OleDbCommand(createTableSql, conn)
                    cmdCreate.ExecuteNonQuery()
                End Using

                ' 3. データを挿入（引数のレコード数を使用）
                Dim insertSql As String = $"INSERT INTO {e} (乱数, 判定) VALUES (?, ?)"

                Using cmdInsert As New OleDbCommand(insertSql, conn)
                    cmdInsert.Parameters.Add("@乱数", OleDbType.Double)
                    cmdInsert.Parameters.Add("@判定", OleDbType.VarChar, 10)

                    For i As Integer = 1 To レコード
                        Dim randomValue As Double = rnd.NextDouble() ' 0.0～1.0の乱数
                        Dim 判定値 As String = If(randomValue <= 採用範囲, "Yes", "No")

                        cmdInsert.Parameters("@乱数").Value = randomValue
                        cmdInsert.Parameters("@判定").Value = 判定値
                        cmdInsert.ExecuteNonQuery()
                    Next
                End Using

                ' 4. 出荷先名またはアイテムを取込
                Dim updateSql As String
                If 区分 = "E" Then
                    updateSql = "UPDATE " & e & " LEFT JOIN T160_全出荷E集計 ON " & e & ".順位 = T160_全出荷E集計.順位 SET " & e & ".出荷先名 = [T160_全出荷E集計]![出荷先];"
                Else
                    updateSql = "UPDATE " & e & " LEFT JOIN T160_全出荷I集計 ON " & e & ".順位 = T160_全出荷I集計.順位 SET " & e & ".アイテム = [T160_全出荷I集計]![アイテム];"
                End If

                Using cmdUpdate As New OleDbCommand(updateSql, conn)
                    cmdUpdate.ExecuteNonQuery()
                End Using

            Catch ex As Exception
                ' エラーが発生しても処理を継続（エラーメッセージは表示しない）
                ' デバッグ用：Console.WriteLine($"T410テーブル作成エラー: {ex.Message}")
            End Try
        End Using
    End Sub
    Sub T410テーブル作成2(e As String, レコード As Integer, seed1 As Integer)
        ' T410テーブル作成1と同じ処理だが、採用範囲 = 採用範囲 - 1

        ' データベースパス
        Dim dbPath As String = Tera計算DataPath & "\EIQ分析AI化\EIQ_AIモデル.accdb"
        Dim connStr As String = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={dbPath};"

        ' テーブル名から区分を判定
        Dim 区分 As String = If(e.Contains("_E"), "E", "I")

        ' 採用範囲を取得（採用範囲 - 1）
        Dim 採用範囲 As Double = If(区分 = "E", E採用範囲, I採用範囲) - 1

        Using conn As New OleDbConnection(connStr)
            Try
                conn.Open()

                ' 1. 既存テーブルがあれば削除（引数のテーブル名を使用）
                Using cmdDrop As New OleDbCommand($"DROP TABLE {e}", conn)
                    Try
                        cmdDrop.ExecuteNonQuery()
                    Catch
                        ' テーブルが存在しない場合は無視
                    End Try
                End Using

                ' 2. T160テーブルから乱数を取得してT410テーブルを作成（SELECT INTO使用）
                Dim ソーステーブル As String = If(区分 = "E", "T160_全出荷E集計", "T160_全出荷I集計")
                Dim フィールド名 As String = If(区分 = "E", "出荷先", "アイテム")
                Dim T410フィールド名 As String = If(区分 = "E", "出荷先名", "アイテム")

                ' T160から乱数を取得し、1回のSELECT INTOでT410作成
                Dim createSelectSql As String = $"SELECT 順位, 乱数, " &
                                                $"IIF(乱数 <= {採用範囲}, 'Yes', 'No') AS 判定, " &
                                                $"{フィールド名} AS {T410フィールド名} " &
                                                $"INTO {e} " &
                                                $"FROM {ソーステーブル}"

                Using cmdCreateSelect As New OleDbCommand(createSelectSql, conn)
                    cmdCreateSelect.ExecuteNonQuery()
                End Using

                ' 採用範囲Chkを設定
                If 区分 = "E" Then
                    E採用範囲Chk = 2
                Else
                    I採用範囲Chk = 2
                End If

            Catch ex As Exception
                ' エラーが発生しても処理を継続（エラーメッセージは表示しない）
                ' デバッグ用：Console.WriteLine($"T410テーブル作成2エラー: {ex.Message}")
            End Try
        End Using
    End Sub
#End Region

#Region " T500_計算対象作成"
    Private Sub T500_計算対象作成()
        ' T410の判定結果に基づいてT500_計算対象を作成
        ' T300のレコードが進むたびに削除→再作成する
        Dim dbPath As String = Tera計算DataPath & "\EIQ分析AI化\EIQ_AIモデル.accdb"
        Dim connStr As String = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={dbPath};"

        Try
            Using conn As New OleDbConnection(connStr)
                conn.Open()

                ' 1. テーブルが存在するか確認
                Dim テーブル存在 As Boolean = False
                Dim schemaTable As DataTable = conn.GetSchema("Tables")
                For Each row As DataRow In schemaTable.Rows
                    If row("TABLE_NAME").ToString().ToUpper() = "T500_計算対象".ToUpper() Then
                        テーブル存在 = True
                        Exit For
                    End If
                Next

                ' 2. テーブルが存在する場合は削除
                If テーブル存在 Then
                    Using cmdDrop As New OleDbCommand("DROP TABLE T500_計算対象", conn)
                        cmdDrop.ExecuteNonQuery()
                    End Using
                End If

                ' 3. テーブル作成（SELECT INTO）
                'Dim sqlCreate As String = "SELECT T200.* INTO T500_計算対象 " &
                '    "FROM (T410_E判定 RIGHT JOIN T200 ON T410_E判定.出荷先名 = T200.出荷先) " &
                '    "LEFT JOIN T410_I判定 ON T200.[アイテム] = T410_I判定.[アイテム] " &
                '    "WHERE (((T410_E判定.判定)='Yes') AND ((T410_I判定.判定)='Yes'));"

                ' 以下のSQLは、エラーを回避するためにT200から直接選択
                Dim sqlCreate As String = "SELECT * INTO T500_計算対象 FROM T200 WHERE 0=1;"

                Using cmdCreate As New OleDbCommand(sqlCreate, conn)
                    cmdCreate.ExecuteNonQuery()
                End Using

                Dim insertSql As String = "INSERT INTO T500_計算対象 ([出荷先名], [アイテム], [ケース], [バラ数], [PL], [容積], [重量], [GPLEランク], [GPLIランク]) " &
                                         "SELECT T410_E判定.出荷先名, T410_I判定.アイテム, T410_I判定.ケース, T410_I判定.バラ数, " &
                                         "T410_E判定.PL, T410_E判定.容積, T410_E判定.重量, T410_E判定.GPLEランク, T410_I判定.GPLIランク " &
                                         "FROM T410_E判定 INNER JOIN T410_I判定 ON T410_E判定.順位 = T410_I判定.順位 " &
                                         "WHERE T410_E判定.判定 = 'Yes' AND T410_I判定.判定 = 'Yes'"

                Using cmdInsert As New OleDbCommand(insertSql, conn)
                    cmdInsert.ExecuteNonQuery()
                End Using

            End Using

            ' 4. 採用範囲Chkが2の場合、データに"A"を付加
            採用範囲Chk()

        Catch ex As Exception
            MsgBox($"T500_計算対象作成エラー: {ex.Message}{vbCrLf}{ex.StackTrace}", MsgBoxStyle.Critical)
            Throw ' エラーを上位に伝播して処理を中断
        End Try
    End Sub
    Private Sub 採用範囲Chk()
        Dim dbPath As String = Tera計算DataPath & "\EIQ分析AI化\EIQ_AIモデル.accdb"
        Dim connStr As String = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={dbPath};"

        Try
            Using conn As New OleDbConnection(connStr)
                conn.Open()

                ' E採用範囲Chk = 2の時、出荷先の語尾に"A"を付加
                If E採用範囲Chk = 2 Then
                    Dim sqlUpdateE As String = "UPDATE T500_計算対象 SET 出荷先 = 出荷先 & 'A'"
                    Using cmdUpdateE As New OleDbCommand(sqlUpdateE, conn)
                        cmdUpdateE.ExecuteNonQuery()
                    End Using
                End If

                ' I採用範囲Chk = 2の時、アイテムの語尾に"A"を付加
                If I採用範囲Chk = 2 Then
                    Dim sqlUpdateI As String = "UPDATE T500_計算対象 SET アイテム = アイテム & 'A'"
                    Using cmdUpdateI As New OleDbCommand(sqlUpdateI, conn)
                        cmdUpdateI.ExecuteNonQuery()
                    End Using
                End If

                ' E採用範囲ChkまたはI採用範囲Chkが2の時、T200のデータをそのままT500_計算対象に追加
                If E採用範囲Chk = 2 OrElse I採用範囲Chk = 2 Then
                    Dim sqlInsertT200 As String = "INSERT INTO T500_計算対象 SELECT * FROM T200"
                    Using cmdInsertT200 As New OleDbCommand(sqlInsertT200, conn)
                        cmdInsertT200.ExecuteNonQuery()
                    End Using
                End If

            End Using

        Catch ex As Exception
            MsgBox($"採用範囲Chkエラー: {ex.Message}", MsgBoxStyle.Critical)
        End Try
    End Sub
    ''' <summary>
    ''' T590_*一時テーブルをOleDb接続で削除（ADOX不使用）
    ''' </summary>
    Private Sub T590一時テーブル削除(conn As OleDbConnection)
        Try
            Dim schema As DataTable = conn.GetSchema("Tables")
            For Each row As DataRow In schema.Rows
                Dim tableName As String = row("TABLE_NAME").ToString()
                If tableName.StartsWith("T590_", StringComparison.OrdinalIgnoreCase) Then
                    Try
                        Using cmdDrop As New OleDbCommand($"DROP TABLE [{tableName}]", conn)
                            cmdDrop.ExecuteNonQuery()
                        End Using
                    Catch
                        ' テーブルが削除できない場合は無視
                    End Try
                End If
            Next
        Catch
            ' スキーマ取得失敗時は無視
        End Try
    End Sub

#End Region

#Region " T600_データモデル作成"

#End Region
    Private Sub T600_データモデル作成()
        ' T500_計算対象から集計してT600_データモデルを更新（7つの処理に分割）
        ' T600_データモデルはE2で既に作成済み（T300と同時作成）

        Dim dbPath As String = Tera計算DataPath & "\EIQ分析AI化\EIQ_AIモデル.accdb"
        Dim connStr As String = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={dbPath};"

        Try
            Using conn As New OleDbConnection(connStr)
                conn.Open()

                ' === T300_進行の作成Chkが"済"の場合はスキップ（二重処理防止） ===
                Dim 作成Chk As String = ""
                Dim sqlCheckChk As String = "SELECT 作成Chk FROM T300_進行 WHERE 進行連番 = ?"
                Using cmdCheckChk As New OleDbCommand(sqlCheckChk, conn)
                    cmdCheckChk.Parameters.AddWithValue("@進行連番", 進行連番)
                    Dim result = cmdCheckChk.ExecuteScalar()
                    If result IsNot Nothing AndAlso Not IsDBNull(result) Then
                        作成Chk = result.ToString()
                    End If
                End Using

                If 作成Chk = "済" Then
                    進行状況L.Text = $"進行連番 {進行連番}: 既に処理済みのためスキップします。"
                    進行状況L.Refresh()
                    Application.DoEvents()
                    Exit Sub
                End If
            End Using

            ' 7つの更新処理を順次実行
            T600_更新1_基本データとEI(connStr)
            T600_更新2_行数(connStr)
            T600_更新3_バラ数(connStr)
            T600_更新4_ケース(connStr)
            T600_更新5_PL(connStr)
            T600_更新6_容積(connStr)
            T600_更新7_重量(connStr)

            進行状況L.Text = $"進行連番 {進行連番}: T600_データモデル更新完了"
            進行状況L.Refresh()
            Application.DoEvents()

            ' データモデルDgvが表示中の場合は更新
            If データモデルDgv表示Rb.Checked Then
                T600_データモデル表示()
            End If

        Catch ex As Exception
            MsgBox($"T600_データモデル作成エラー: {ex.Message}", MsgBoxStyle.Critical)
            Throw
        End Try
    End Sub
    Private Sub T600_データモデル表示()
        Dim dbPath As String = Tera計算DataPath & "\EIQ分析AI化\EIQ_AIモデル.accdb"
        Dim connStr As String = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={dbPath};"

        Try
            Using conn As New OleDbConnection(connStr)
                conn.Open()

                ' T600_データモデルテーブルが存在するか確認
                Dim テーブル存在 As Boolean = False
                Dim dt As DataTable = conn.GetSchema("Tables")
                For Each row As DataRow In dt.Rows
                    If row("TABLE_NAME").ToString().ToUpper() = "T600_データモデル".ToUpper() Then
                        テーブル存在 = True
                        Exit For
                    End If
                Next

                If Not テーブル存在 Then
                    ' テーブルが存在しない場合はスルー
                    データモデルDgv.Visible = False
                    Exit Sub
                End If

                ' データが存在するか確認
                Dim sqlCount As String = "SELECT COUNT(*) FROM T600_データモデル"
                Using cmdCount As New OleDbCommand(sqlCount, conn)
                    Dim count As Integer = Convert.ToInt32(cmdCount.ExecuteScalar())
                    If count = 0 Then
                        ' データが無い場合はスルー
                        データモデルDgv.Visible = False
                        Exit Sub
                    End If
                End Using

                ' データを取得して表示
                Dim sql As String = "SELECT * FROM T600_データモデル ORDER BY モデル連番"
                Dim adapter As New OleDbDataAdapter(sql, conn)
                Dim dtData As New DataTable()
                adapter.Fill(dtData)

                データモデルDgv.DataSource = dtData
                データモデルDgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
                データモデルDgv.Visible = True

                ' データバインド完了後に画面を更新
                データモデルDgv.Refresh()
                Application.DoEvents()

                ' 更新した進行連番の行を表示
                If データモデルDgv.Rows.Count > 0 AndAlso 進行連番 > 0 Then
                    ' モデル連番列のインデックスを取得
                    Dim モデル連番列Index As Integer = -1
                    For i As Integer = 0 To データモデルDgv.Columns.Count - 1
                        If データモデルDgv.Columns(i).Name.ToUpper() = "モデル連番" Then
                            モデル連番列Index = i
                            Exit For
                        End If
                    Next

                    ' モデル連番に一致する行を検索
                    If モデル連番列Index >= 0 Then
                        For i As Integer = 0 To データモデルDgv.Rows.Count - 1
                            If データモデルDgv.Rows(i).IsNewRow Then Continue For

                            Dim セル値 = データモデルDgv.Rows(i).Cells(モデル連番列Index).Value
                            If セル値 IsNot Nothing AndAlso Not IsDBNull(セル値) Then
                                Dim モデル連番値 As Integer = Convert.ToInt32(セル値)
                                If モデル連番値 = 進行連番 Then
                                    ' 該当行が見つかった
                                    データモデルDgv.ClearSelection()
                                    データモデルDgv.Rows(i).Selected = True

                                    ' 該当行の5行上を表示（スクロール）
                                    Dim スクロール位置 As Integer = Math.Max(0, i - 5)
                                    データモデルDgv.FirstDisplayedScrollingRowIndex = スクロール位置

                                    ' 画面を更新
                                    データモデルDgv.Refresh()
                                    Application.DoEvents()
                                    Exit For
                                End If
                            End If
                        Next
                    End If
                End If

            End Using
        Catch ex As Exception
            ' エラーが発生してもスルー（データが無い場合も含む）
            データモデルDgv.Visible = False
        End Try
    End Sub
#Region "  7つの更新処理を順次実行"

    ' ========================================
    ' 1. 基本データとE1-E5、I1-I5の更新
    ' ========================================
    Private Sub T600_更新1_基本データとEI(connStr As String)
        Using conn As New OleDbConnection(connStr)
            conn.Open()

            ' === E1-E5の計算（GPLEランク別の出荷先数） ===
            Dim E1 As Double = 0, E2 As Double = 0, E3 As Double = 0, E4 As Double = 0, E5 As Double = 0

            ' 一時テーブルを削除（存在する場合）
            T590一時テーブル削除(conn)

            ' 一時テーブルを作成（GPLEランク別の一意の出荷先）
            Dim sqlCreateTempE As String = "SELECT GPLEランク, 出荷先 INTO T590_E出荷先一時 FROM T500_計算対象 GROUP BY GPLEランク, 出荷先"
            Using cmdCreateTempE As New OleDbCommand(sqlCreateTempE, conn)
                cmdCreateTempE.ExecuteNonQuery()
            End Using

            ' GPLEランク別の出荷先数を取得
            Dim sqlE As String = "SELECT T590_E出荷先一時.GPLEランク, Count(T590_E出荷先一時.出荷先) AS 出荷先数 FROM T590_E出荷先一時 GROUP BY T590_E出荷先一時.GPLEランク;"

            Using cmdE As New OleDbCommand(sqlE, conn)
                Using readerE As OleDbDataReader = cmdE.ExecuteReader()
                    While readerE.Read()
                        If Not IsDBNull(readerE("GPLEランク")) AndAlso Not IsDBNull(readerE("出荷先数")) Then
                            Dim ランク As String = readerE("GPLEランク").ToString()
                            Dim 数 As Double = Convert.ToInt32(readerE("出荷先数"))

                            Select Case ランク
                                Case "GPLE_A1" : E1 = 数
                                Case "GPLE_A2" : E2 = 数
                                Case "GPLE_B" : E3 = 数
                                Case "GPLE_C" : E4 = 数
                                Case "GPLE_D" : E5 = 数
                            End Select
                        End If
                    End While
                End Using
            End Using

            ' E一時テーブルを削除
            T590一時テーブル削除(conn)

            ' 出荷先数の合計（E1 - E5の合計）
            Dim 出荷先数 As Double = E1 + E2 + E3 + E4 + E5

            ' === I1-I5の計算（GPLIランク別のアイテム数） ===
            Dim I1 As Double = 0, I2 As Double = 0, I3 As Double = 0, I4 As Double = 0, I5 As Double = 0

            ' I一時テーブルを削除（存在する場合）
            T590一時テーブル削除(conn)

            ' 一時テーブルを作成（GPLIランク別の一意のアイテム）
            Dim sqlCreateTempI As String = "SELECT GPLIランク, アイテム INTO T590_Iアイテム一時 FROM T500_計算対象 GROUP BY GPLIランク, アイテム"
            Using cmdCreateTempI As New OleDbCommand(sqlCreateTempI, conn)
                cmdCreateTempI.ExecuteNonQuery()
            End Using

            ' GPLIランク別のアイテム数を取得
            Dim sqlI As String = "SELECT T590_Iアイテム一時.GPLIランク, Count(T590_Iアイテム一時.アイテム) AS アイテム数 FROM T590_Iアイテム一時 GROUP BY T590_Iアイテム一時.GPLIランク;"

            Using cmdI As New OleDbCommand(sqlI, conn)
                Using readerI As OleDbDataReader = cmdI.ExecuteReader()
                    While readerI.Read()
                        If Not IsDBNull(readerI("GPLIランク")) AndAlso Not IsDBNull(readerI("アイテム数")) Then
                            Dim ランク As String = readerI("GPLIランク").ToString()
                            Dim 数 As Double = Convert.ToDouble(readerI("アイテム数"))

                            Select Case ランク
                                Case "GPLI_A1" : I1 = 数
                                Case "GPLI_A2" : I2 = 数
                                Case "GPLI_B" : I3 = 数
                                Case "GPLI_C" : I4 = 数
                                Case "GPLI_D" : I5 = 数
                            End Select
                        End If
                    End While
                End Using
            End Using

            ' I一時テーブルを削除
            T590一時テーブル削除(conn)

            ' アイテム数の合計（I1-I5の合計）
            Dim アイテム数 As Double = I1 + I2 + I3 + I4 + I5

            ' === バラ数量の計算 ===
            Dim バラ数量 As Double = 0
            Dim sqlBara As String = "SELECT SUM(バラ数) AS バラ数量 FROM T500_計算対象"

            Using cmdBara As New OleDbCommand(sqlBara, conn)
                Dim result = cmdBara.ExecuteScalar()
                If Not IsDBNull(result) AndAlso result IsNot Nothing Then
                    バラ数量 = Convert.ToDouble(result)
                End If
            End Using

            ' === 行数の計算 ===
            Dim 行数 As Double = 0
            Dim sqlCount As String = "SELECT COUNT(*) AS 行数 FROM T500_計算対象"
            Using cmdCount As New OleDbCommand(sqlCount, conn)
                Dim result = cmdCount.ExecuteScalar()
                If result IsNot Nothing AndAlso Not IsDBNull(result) Then
                    Double.TryParse(result.ToString(), 行数)
                End If
            End Using

            ' === T600_データモデルを更新（1: モデル連番、出荷先数、アイテム数、バラ数量、行数、E1-E5、I1-I5） ===
            Dim sqlUpdate As String = "UPDATE T600_データモデル SET " &
                "出荷先数 = @出荷先数, アイテム数 = @アイテム数, バラ数量 = @バラ数量, 行数 = @行数, " &
                "E1 = @E1, E2 = @E2, E3 = @E3, E4 = @E4, E5 = @E5, " &
                "I1 = @I1, I2 = @I2, I3 = @I3, I4 = @I4, I5 = @I5 " &
                "WHERE モデル連番 = @モデル連番"

            Using cmdUpdate As New OleDbCommand(sqlUpdate, conn)
                cmdUpdate.Parameters.AddWithValue("@出荷先数", 出荷先数)
                cmdUpdate.Parameters.AddWithValue("@アイテム数", アイテム数)
                cmdUpdate.Parameters.AddWithValue("@バラ数量", バラ数量)
                cmdUpdate.Parameters.AddWithValue("@行数", 行数)
                cmdUpdate.Parameters.AddWithValue("@E1", E1)
                cmdUpdate.Parameters.AddWithValue("@E2", E2)
                cmdUpdate.Parameters.AddWithValue("@E3", E3)
                cmdUpdate.Parameters.AddWithValue("@E4", E4)
                cmdUpdate.Parameters.AddWithValue("@E5", E5)
                cmdUpdate.Parameters.AddWithValue("@I1", I1)
                cmdUpdate.Parameters.AddWithValue("@I2", I2)
                cmdUpdate.Parameters.AddWithValue("@I3", I3)
                cmdUpdate.Parameters.AddWithValue("@I4", I4)
                cmdUpdate.Parameters.AddWithValue("@I5", I5)
                cmdUpdate.Parameters.AddWithValue("@モデル連番", 進行連番)
                cmdUpdate.ExecuteNonQuery()
            End Using

            進行状況L.Text = $"進行連番 {進行連番}: [1/7] 基本データ更新完了 (出荷先数:{出荷先数}, アイテム数:{アイテム数})"
            進行状況L.Refresh()
            Application.DoEvents()
        End Using
    End Sub

    ' ========================================
    ' 2. 行数01～25の更新
    ' ========================================
    Private Sub T600_更新2_行数(connStr As String)
        Using conn As New OleDbConnection(connStr)
            conn.Open()

            ' === 行数01～25の計算（QPLQランク別） ===
            Dim 行数01 As Double = 0, 行数02 As Double = 0, 行数03 As Double = 0, 行数04 As Double = 0, 行数05 As Double = 0
            Dim 行数06 As Double = 0, 行数07 As Double = 0, 行数08 As Double = 0, 行数09 As Double = 0, 行数10 As Double = 0
            Dim 行数11 As Double = 0, 行数12 As Double = 0, 行数13 As Double = 0, 行数14 As Double = 0, 行数15 As Double = 0
            Dim 行数16 As Double = 0, 行数17 As Double = 0, 行数18 As Double = 0, 行数19 As Double = 0, 行数20 As Double = 0
            Dim 行数21 As Double = 0, 行数22 As Double = 0, 行数23 As Double = 0, 行数24 As Double = 0, 行数25 As Double = 0

            Dim sql行数 As String = "SELECT GPLEランク, GPLIランク, COUNT(*) AS 行数 FROM T500_計算対象 GROUP BY GPLEランク, GPLIランク"
            Using cmd行数 As New OleDbCommand(sql行数, conn)
                Using reader行数 As OleDbDataReader = cmd行数.ExecuteReader()
                    While reader行数.Read()
                        If Not IsDBNull(reader行数("GPLEランク")) AndAlso Not IsDBNull(reader行数("GPLIランク")) AndAlso Not IsDBNull(reader行数("行数")) Then
                            Dim GPLEランク As String = reader行数("GPLEランク").ToString()
                            Dim GPLIランク As String = reader行数("GPLIランク").ToString()
                            Dim 数 As Double = Convert.ToDouble(reader行数("行数"))
                            Dim キー As String = GPLEランク & "_" & GPLIランク
                            Select Case キー
                                Case "GPLE_A1_GPLI_A1" : 行数01 = 数
                                Case "GPLE_A1_GPLI_A2" : 行数02 = 数
                                Case "GPLE_A1_GPLI_B" : 行数03 = 数
                                Case "GPLE_A1_GPLI_C" : 行数04 = 数
                                Case "GPLE_A1_GPLI_D" : 行数05 = 数
                                Case "GPLE_A2_GPLI_A1" : 行数06 = 数
                                Case "GPLE_A2_GPLI_A2" : 行数07 = 数
                                Case "GPLE_A2_GPLI_B" : 行数08 = 数
                                Case "GPLE_A2_GPLI_C" : 行数09 = 数
                                Case "GPLE_A2_GPLI_D" : 行数10 = 数
                                Case "GPLE_B_GPLI_A1" : 行数11 = 数
                                Case "GPLE_B_GPLI_A2" : 行数12 = 数
                                Case "GPLE_B_GPLI_B" : 行数13 = 数
                                Case "GPLE_B_GPLI_C" : 行数14 = 数
                                Case "GPLE_B_GPLI_D" : 行数15 = 数
                                Case "GPLE_C_GPLI_A1" : 行数16 = 数
                                Case "GPLE_C_GPLI_A2" : 行数17 = 数
                                Case "GPLE_C_GPLI_B" : 行数18 = 数
                                Case "GPLE_C_GPLI_C" : 行数19 = 数
                                Case "GPLE_C_GPLI_D" : 行数20 = 数
                                Case "GPLE_D_GPLI_A1" : 行数21 = 数
                                Case "GPLE_D_GPLI_A2" : 行数22 = 数
                                Case "GPLE_D_GPLI_B" : 行数23 = 数
                                Case "GPLE_D_GPLI_C" : 行数24 = 数
                                Case "GPLE_D_GPLI_D" : 行数25 = 数
                            End Select
                        End If
                    End While
                End Using
            End Using

            ' === T600_データモデルを更新（2: 行数01～25） ===
            Dim sqlUpdate As String = "UPDATE T600_データモデル SET " &
                "行数01 = @行数01, 行数02 = @行数02, 行数03 = @行数03, 行数04 = @行数04, 行数05 = @行数05, " &
                "行数06 = @行数06, 行数07 = @行数07, 行数08 = @行数08, 行数09 = @行数09, 行数10 = @行数10, " &
                "行数11 = @行数11, 行数12 = @行数12, 行数13 = @行数13, 行数14 = @行数14, 行数15 = @行数15, " &
                "行数16 = @行数16, 行数17 = @行数17, 行数18 = @行数18, 行数19 = @行数19, 行数20 = @行数20, " &
                "行数21 = @行数21, 行数22 = @行数22, 行数23 = @行数23, 行数24 = @行数24, 行数25 = @行数25 " &
                "WHERE モデル連番 = @モデル連番"

            Using cmdUpdate As New OleDbCommand(sqlUpdate, conn)
                cmdUpdate.Parameters.AddWithValue("@行数01", 行数01)
                cmdUpdate.Parameters.AddWithValue("@行数02", 行数02)
                cmdUpdate.Parameters.AddWithValue("@行数03", 行数03)
                cmdUpdate.Parameters.AddWithValue("@行数04", 行数04)
                cmdUpdate.Parameters.AddWithValue("@行数05", 行数05)
                cmdUpdate.Parameters.AddWithValue("@行数06", 行数06)
                cmdUpdate.Parameters.AddWithValue("@行数07", 行数07)
                cmdUpdate.Parameters.AddWithValue("@行数08", 行数08)
                cmdUpdate.Parameters.AddWithValue("@行数09", 行数09)
                cmdUpdate.Parameters.AddWithValue("@行数10", 行数10)
                cmdUpdate.Parameters.AddWithValue("@行数11", 行数11)
                cmdUpdate.Parameters.AddWithValue("@行数12", 行数12)
                cmdUpdate.Parameters.AddWithValue("@行数13", 行数13)
                cmdUpdate.Parameters.AddWithValue("@行数14", 行数14)
                cmdUpdate.Parameters.AddWithValue("@行数15", 行数15)
                cmdUpdate.Parameters.AddWithValue("@行数16", 行数16)
                cmdUpdate.Parameters.AddWithValue("@行数17", 行数17)
                cmdUpdate.Parameters.AddWithValue("@行数18", 行数18)
                cmdUpdate.Parameters.AddWithValue("@行数19", 行数19)
                cmdUpdate.Parameters.AddWithValue("@行数20", 行数20)
                cmdUpdate.Parameters.AddWithValue("@行数21", 行数21)
                cmdUpdate.Parameters.AddWithValue("@行数22", 行数22)
                cmdUpdate.Parameters.AddWithValue("@行数23", 行数23)
                cmdUpdate.Parameters.AddWithValue("@行数24", 行数24)
                cmdUpdate.Parameters.AddWithValue("@行数25", 行数25)
                cmdUpdate.Parameters.AddWithValue("@モデル連番", 進行連番)
                cmdUpdate.ExecuteNonQuery()
            End Using

            進行状況L.Text = $"進行連番 {進行連番}: [2/7] 行数データ更新完了"
            進行状況L.Refresh()
            Application.DoEvents()
        End Using
    End Sub

    ' ========================================
    ' 3. バラ数01～25の更新
    ' ========================================
    Private Sub T600_更新3_バラ数(connStr As String)
        Using conn As New OleDbConnection(connStr)
            conn.Open()

            ' === バラ数01～25の計算（QPLQランク別） ===
            Dim バラ数01 As Double = 0, バラ数02 As Double = 0, バラ数03 As Double = 0, バラ数04 As Double = 0, バラ数05 As Double = 0
            Dim バラ数06 As Double = 0, バラ数07 As Double = 0, バラ数08 As Double = 0, バラ数09 As Double = 0, バラ数10 As Double = 0
            Dim バラ数11 As Double = 0, バラ数12 As Double = 0, バラ数13 As Double = 0, バラ数14 As Double = 0, バラ数15 As Double = 0
            Dim バラ数16 As Double = 0, バラ数17 As Double = 0, バラ数18 As Double = 0, バラ数19 As Double = 0, バラ数20 As Double = 0
            Dim バラ数21 As Double = 0, バラ数22 As Double = 0, バラ数23 As Double = 0, バラ数24 As Double = 0, バラ数25 As Double = 0

            Dim sqlバラ数 As String = "SELECT T500_計算対象.GPLEランク, T500_計算対象.GPLIランク, Sum(T500_計算対象.Gバ) AS Gバの合計 FROM T500_計算対象 GROUP BY T500_計算対象.GPLEランク, T500_計算対象.GPLIランク;"
            Using cmdバラ数 As New OleDbCommand(sqlバラ数, conn)
                Using readerバラ数 As OleDbDataReader = cmdバラ数.ExecuteReader()
                    While readerバラ数.Read()
                        If Not IsDBNull(readerバラ数("GPLEランク")) AndAlso Not IsDBNull(readerバラ数("GPLIランク")) AndAlso Not IsDBNull(readerバラ数("Gバの合計")) Then
                            Dim GPLEランク As String = readerバラ数("GPLEランク").ToString()
                            Dim GPLIランク As String = readerバラ数("GPLIランク").ToString()
                            Dim 数 As Double = Convert.ToDouble(readerバラ数("Gバの合計"))
                            Dim キー As String = GPLEランク & "_" & GPLIランク
                            Select Case キー
                                Case "GPLE_A1_GPLI_A1" : バラ数01 = 数
                                Case "GPLE_A1_GPLI_A2" : バラ数02 = 数
                                Case "GPLE_A1_GPLI_B" : バラ数03 = 数
                                Case "GPLE_A1_GPLI_C" : バラ数04 = 数
                                Case "GPLE_A1_GPLI_D" : バラ数05 = 数
                                Case "GPLE_A2_GPLI_A1" : バラ数06 = 数
                                Case "GPLE_A2_GPLI_A2" : バラ数07 = 数
                                Case "GPLE_A2_GPLI_B" : バラ数08 = 数
                                Case "GPLE_A2_GPLI_C" : バラ数09 = 数
                                Case "GPLE_A2_GPLI_D" : バラ数10 = 数
                                Case "GPLE_B_GPLI_A1" : バラ数11 = 数
                                Case "GPLE_B_GPLI_A2" : バラ数12 = 数
                                Case "GPLE_B_GPLI_B" : バラ数13 = 数
                                Case "GPLE_B_GPLI_C" : バラ数14 = 数
                                Case "GPLE_B_GPLI_D" : バラ数15 = 数
                                Case "GPLE_C_GPLI_A1" : バラ数16 = 数
                                Case "GPLE_C_GPLI_A2" : バラ数17 = 数
                                Case "GPLE_C_GPLI_B" : バラ数18 = 数
                                Case "GPLE_C_GPLI_C" : バラ数19 = 数
                                Case "GPLE_C_GPLI_D" : バラ数20 = 数
                                Case "GPLE_D_GPLI_A1" : バラ数21 = 数
                                Case "GPLE_D_GPLI_A2" : バラ数22 = 数
                                Case "GPLE_D_GPLI_B" : バラ数23 = 数
                                Case "GPLE_D_GPLI_C" : バラ数24 = 数
                                Case "GPLE_D_GPLI_D" : バラ数25 = 数
                            End Select
                        End If
                    End While
                End Using
            End Using

            ' === T600_データモデルを更新（3: バラ数01～25） ===
            Dim sqlUpdate As String = "UPDATE T600_データモデル SET " &
            "バラ数01 = @バラ数01, バラ数02 = @バラ数02, バラ数03 = @バラ数03, バラ数04 = @バラ数04, バラ数05 = @バラ数05, " &
            "バラ数06 = @バラ数06, バラ数07 = @バラ数07, バラ数08 = @バラ数08, バラ数09 = @バラ数09, バラ数10 = @バラ数10, " &
            "バラ数11 = @バラ数11, バラ数12 = @バラ数12, バラ数13 = @バラ数13, バラ数14 = @バラ数14, バラ数15 = @バラ数15, " &
            "バラ数16 = @バラ数16, バラ数17 = @バラ数17, バラ数18 = @バラ数18, バラ数19 = @バラ数19, バラ数20 = @バラ数20, " &
            "バラ数21 = @バラ数21, バラ数22 = @バラ数22, バラ数23 = @バラ数23, バラ数24 = @バラ数24, バラ数25 = @バラ数25 " &
            "WHERE モデル連番 = @モデル連番"

            Using cmdUpdate As New OleDbCommand(sqlUpdate, conn)
                cmdUpdate.Parameters.AddWithValue("@バラ数01", バラ数01)
                cmdUpdate.Parameters.AddWithValue("@バラ数02", バラ数02)
                cmdUpdate.Parameters.AddWithValue("@バラ数03", バラ数03)
                cmdUpdate.Parameters.AddWithValue("@バラ数04", バラ数04)
                cmdUpdate.Parameters.AddWithValue("@バラ数05", バラ数05)
                cmdUpdate.Parameters.AddWithValue("@バラ数06", バラ数06)
                cmdUpdate.Parameters.AddWithValue("@バラ数07", バラ数07)
                cmdUpdate.Parameters.AddWithValue("@バラ数08", バラ数08)
                cmdUpdate.Parameters.AddWithValue("@バラ数09", バラ数09)
                cmdUpdate.Parameters.AddWithValue("@バラ数10", バラ数10)
                cmdUpdate.Parameters.AddWithValue("@バラ数11", バラ数11)
                cmdUpdate.Parameters.AddWithValue("@バラ数12", バラ数12)
                cmdUpdate.Parameters.AddWithValue("@バラ数13", バラ数13)
                cmdUpdate.Parameters.AddWithValue("@バラ数14", バラ数14)
                cmdUpdate.Parameters.AddWithValue("@バラ数15", バラ数15)
                cmdUpdate.Parameters.AddWithValue("@バラ数16", バラ数16)
                cmdUpdate.Parameters.AddWithValue("@バラ数17", バラ数17)
                cmdUpdate.Parameters.AddWithValue("@バラ数18", バラ数18)
                cmdUpdate.Parameters.AddWithValue("@バラ数19", バラ数19)
                cmdUpdate.Parameters.AddWithValue("@バラ数20", バラ数20)
                cmdUpdate.Parameters.AddWithValue("@バラ数21", バラ数21)
                cmdUpdate.Parameters.AddWithValue("@バラ数22", バラ数22)
                cmdUpdate.Parameters.AddWithValue("@バラ数23", バラ数23)
                cmdUpdate.Parameters.AddWithValue("@バラ数24", バラ数24)
                cmdUpdate.Parameters.AddWithValue("@バラ数25", バラ数25)
                cmdUpdate.Parameters.AddWithValue("@モデル連番", 進行連番)
                cmdUpdate.ExecuteNonQuery()
            End Using

            進行状況L.Text = $"進行連番 {進行連番}: [3/7] バラ数データ更新完了"
            進行状況L.Refresh()
            Application.DoEvents()
        End Using
    End Sub

    ' ========================================
    ' 4. ケース01～25の更新
    ' ========================================
    Private Sub T600_更新4_ケース(connStr As String)
        Using conn As New OleDbConnection(connStr)
            conn.Open()

            ' === ケース01～25の計算（GPLEランク×GPLIランク別） ===
            Dim ケース01 As Double = 0, ケース02 As Double = 0, ケース03 As Double = 0, ケース04 As Double = 0, ケース05 As Double = 0
            Dim ケース06 As Double = 0, ケース07 As Double = 0, ケース08 As Double = 0, ケース09 As Double = 0, ケース10 As Double = 0
            Dim ケース11 As Double = 0, ケース12 As Double = 0, ケース13 As Double = 0, ケース14 As Double = 0, ケース15 As Double = 0
            Dim ケース16 As Double = 0, ケース17 As Double = 0, ケース18 As Double = 0, ケース19 As Double = 0, ケース20 As Double = 0
            Dim ケース21 As Double = 0, ケース22 As Double = 0, ケース23 As Double = 0, ケース24 As Double = 0, ケース25 As Double = 0

            Dim sqlケース As String = "SELECT T500_計算対象.GPLEランク, T500_計算対象.GPLIランク, Sum(T500_計算対象.Gケ) AS Gケの合計 FROM T500_計算対象 GROUP BY T500_計算対象.GPLEランク, T500_計算対象.GPLIランク;"
            Using cmdケース As New OleDbCommand(sqlケース, conn)
                Using readerケース As OleDbDataReader = cmdケース.ExecuteReader()
                    While readerケース.Read()
                        If Not IsDBNull(readerケース("GPLEランク")) AndAlso Not IsDBNull(readerケース("GPLIランク")) AndAlso Not IsDBNull(readerケース("Gケの合計")) Then
                            Dim GPLEランク As String = readerケース("GPLEランク").ToString()
                            Dim GPLIランク As String = readerケース("GPLIランク").ToString()
                            Dim 数 As Double = Convert.ToDouble(readerケース("Gケの合計"))
                            Dim キー As String = GPLEランク & "_" & GPLIランク
                            Select Case キー
                                Case "GPLE_A1_GPLI_A1" : ケース01 = 数
                                Case "GPLE_A1_GPLI_A2" : ケース02 = 数
                                Case "GPLE_A1_GPLI_B" : ケース03 = 数
                                Case "GPLE_A1_GPLI_C" : ケース04 = 数
                                Case "GPLE_A1_GPLI_D" : ケース05 = 数
                                Case "GPLE_A2_GPLI_A1" : ケース06 = 数
                                Case "GPLE_A2_GPLI_A2" : ケース07 = 数
                                Case "GPLE_A2_GPLI_B" : ケース08 = 数
                                Case "GPLE_A2_GPLI_C" : ケース09 = 数
                                Case "GPLE_A2_GPLI_D" : ケース10 = 数
                                Case "GPLE_B_GPLI_A1" : ケース11 = 数
                                Case "GPLE_B_GPLI_A2" : ケース12 = 数
                                Case "GPLE_B_GPLI_B" : ケース13 = 数
                                Case "GPLE_B_GPLI_C" : ケース14 = 数
                                Case "GPLE_B_GPLI_D" : ケース15 = 数
                                Case "GPLE_C_GPLI_A1" : ケース16 = 数
                                Case "GPLE_C_GPLI_A2" : ケース17 = 数
                                Case "GPLE_C_GPLI_B" : ケース18 = 数
                                Case "GPLE_C_GPLI_C" : ケース19 = 数
                                Case "GPLE_C_GPLI_D" : ケース20 = 数
                                Case "GPLE_D_GPLI_A1" : ケース21 = 数
                                Case "GPLE_D_GPLI_A2" : ケース22 = 数
                                Case "GPLE_D_GPLI_B" : ケース23 = 数
                                Case "GPLE_D_GPLI_C" : ケース24 = 数
                                Case "GPLE_D_GPLI_D" : ケース25 = 数
                            End Select
                        End If
                    End While
                End Using
            End Using

            ' === T600_データモデルを更新（4: ケース01～25） ===
            Dim sqlUpdate As String = "UPDATE T600_データモデル SET " &
                "ケース01 = @ケース01, ケース02 = @ケース02, ケース03 = @ケース03, ケース04 = @ケース04, ケース05 = @ケース05, " &
                "ケース06 = @ケース06, ケース07 = @ケース07, ケース08 = @ケース08, ケース09 = @ケース09, ケース10 = @ケース10, " &
                "ケース11 = @ケース11, ケース12 = @ケース12, ケース13 = @ケース13, ケース14 = @ケース14, ケース15 = @ケース15, " &
                "ケース16 = @ケース16, ケース17 = @ケース17, ケース18 = @ケース18, ケース19 = @ケース19, ケース20 = @ケース20, " &
                "ケース21 = @ケース21, ケース22 = @ケース22, ケース23 = @ケース23, ケース24 = @ケース24, ケース25 = @ケース25 " &
                "WHERE モデル連番 = @モデル連番"

            Using cmdUpdate As New OleDbCommand(sqlUpdate, conn)
                cmdUpdate.Parameters.AddWithValue("@ケース01", ケース01)
                cmdUpdate.Parameters.AddWithValue("@ケース02", ケース02)
                cmdUpdate.Parameters.AddWithValue("@ケース03", ケース03)
                cmdUpdate.Parameters.AddWithValue("@ケース04", ケース04)
                cmdUpdate.Parameters.AddWithValue("@ケース05", ケース05)
                cmdUpdate.Parameters.AddWithValue("@ケース06", ケース06)
                cmdUpdate.Parameters.AddWithValue("@ケース07", ケース07)
                cmdUpdate.Parameters.AddWithValue("@ケース08", ケース08)
                cmdUpdate.Parameters.AddWithValue("@ケース09", ケース09)
                cmdUpdate.Parameters.AddWithValue("@ケース10", ケース10)
                cmdUpdate.Parameters.AddWithValue("@ケース11", ケース11)
                cmdUpdate.Parameters.AddWithValue("@ケース12", ケース12)
                cmdUpdate.Parameters.AddWithValue("@ケース13", ケース13)
                cmdUpdate.Parameters.AddWithValue("@ケース14", ケース14)
                cmdUpdate.Parameters.AddWithValue("@ケース15", ケース15)
                cmdUpdate.Parameters.AddWithValue("@ケース16", ケース16)
                cmdUpdate.Parameters.AddWithValue("@ケース17", ケース17)
                cmdUpdate.Parameters.AddWithValue("@ケース18", ケース18)
                cmdUpdate.Parameters.AddWithValue("@ケース19", ケース19)
                cmdUpdate.Parameters.AddWithValue("@ケース20", ケース20)
                cmdUpdate.Parameters.AddWithValue("@ケース21", ケース21)
                cmdUpdate.Parameters.AddWithValue("@ケース22", ケース22)
                cmdUpdate.Parameters.AddWithValue("@ケース23", ケース23)
                cmdUpdate.Parameters.AddWithValue("@ケース24", ケース24)
                cmdUpdate.Parameters.AddWithValue("@ケース25", ケース25)
                cmdUpdate.Parameters.AddWithValue("@モデル連番", 進行連番)
                cmdUpdate.ExecuteNonQuery()
            End Using

            進行状況L.Text = $"進行連番 {進行連番}: [4/7] ケースデータ更新完了"
            進行状況L.Refresh()
            Application.DoEvents()
        End Using
    End Sub

    ' ========================================
    ' 5. PL01～25の更新
    ' ========================================
    Private Sub T600_更新5_PL(connStr As String)
        Using conn As New OleDbConnection(connStr)
            conn.Open()

            ' === PL01～25の計算（GPLEランク×GPLIランク別） ===
            Dim PL01 As Double = 0, PL02 As Double = 0, PL03 As Double = 0, PL04 As Double = 0, PL05 As Double = 0
            Dim PL06 As Double = 0, PL07 As Double = 0, PL08 As Double = 0, PL09 As Double = 0, PL10 As Double = 0
            Dim PL11 As Double = 0, PL12 As Double = 0, PL13 As Double = 0, PL14 As Double = 0, PL15 As Double = 0
            Dim PL16 As Double = 0, PL17 As Double = 0, PL18 As Double = 0, PL19 As Double = 0, PL20 As Double = 0
            Dim PL21 As Double = 0, PL22 As Double = 0, PL23 As Double = 0, PL24 As Double = 0, PL25 As Double = 0

            Dim sqlPL As String = "SELECT T500_計算対象.GPLEランク, T500_計算対象.GPLIランク, Sum(T500_計算対象.GPL) AS GPLの合計 FROM T500_計算対象 GROUP BY T500_計算対象.GPLEランク, T500_計算対象.GPLIランク;"
            Using cmdPL As New OleDbCommand(sqlPL, conn)
                Using readerPL As OleDbDataReader = cmdPL.ExecuteReader()
                    While readerPL.Read()
                        If Not IsDBNull(readerPL("GPLEランク")) AndAlso Not IsDBNull(readerPL("GPLIランク")) AndAlso Not IsDBNull(readerPL("GPLの合計")) Then
                            Dim GPLEランク As String = readerPL("GPLEランク").ToString()
                            Dim GPLIランク As String = readerPL("GPLIランク").ToString()
                            Dim 数 As Double = Convert.ToDouble(readerPL("GPLの合計"))
                            Dim キー As String = GPLEランク & "_" & GPLIランク
                            Select Case キー
                                Case "GPLE_A1_GPLI_A1" : PL01 = 数
                                Case "GPLE_A1_GPLI_A2" : PL02 = 数
                                Case "GPLE_A1_GPLI_B" : PL03 = 数
                                Case "GPLE_A1_GPLI_C" : PL04 = 数
                                Case "GPLE_A1_GPLI_D" : PL05 = 数
                                Case "GPLE_A2_GPLI_A1" : PL06 = 数
                                Case "GPLE_A2_GPLI_A2" : PL07 = 数
                                Case "GPLE_A2_GPLI_B" : PL08 = 数
                                Case "GPLE_A2_GPLI_C" : PL09 = 数
                                Case "GPLE_A2_GPLI_D" : PL10 = 数
                                Case "GPLE_B_GPLI_A1" : PL11 = 数
                                Case "GPLE_B_GPLI_A2" : PL12 = 数
                                Case "GPLE_B_GPLI_B" : PL13 = 数
                                Case "GPLE_B_GPLI_C" : PL14 = 数
                                Case "GPLE_B_GPLI_D" : PL15 = 数
                                Case "GPLE_C_GPLI_A1" : PL16 = 数
                                Case "GPLE_C_GPLI_A2" : PL17 = 数
                                Case "GPLE_C_GPLI_B" : PL18 = 数
                                Case "GPLE_C_GPLI_C" : PL19 = 数
                                Case "GPLE_C_GPLI_D" : PL20 = 数
                                Case "GPLE_D_GPLI_A1" : PL21 = 数
                                Case "GPLE_D_GPLI_A2" : PL22 = 数
                                Case "GPLE_D_GPLI_B" : PL23 = 数
                                Case "GPLE_D_GPLI_C" : PL24 = 数
                                Case "GPLE_D_GPLI_D" : PL25 = 数
                            End Select
                        End If
                    End While
                End Using
            End Using

            ' === T600_データモデルを更新（5: PL01～25） ===
            Dim sqlUpdate As String = "UPDATE T600_データモデル SET " &
                "PL01 = @PL01, PL02 = @PL02, PL03 = @PL03, PL04 = @PL04, PL05 = @PL05, " &
                "PL06 = @PL06, PL07 = @PL07, PL08 = @PL08, PL09 = @PL09, PL10 = @PL10, " &
                "PL11 = @PL11, PL12 = @PL12, PL13 = @PL13, PL14 = @PL14, PL15 = @PL15, " &
                "PL16 = @PL16, PL17 = @PL17, PL18 = @PL18, PL19 = @PL19, PL20 = @PL20, " &
                "PL21 = @PL21, PL22 = @PL22, PL23 = @PL23, PL24 = @PL24, PL25 = @PL25 " &
                "WHERE モデル連番 = @モデル連番"

            Using cmdUpdate As New OleDbCommand(sqlUpdate, conn)
                cmdUpdate.Parameters.AddWithValue("@PL01", PL01)
                cmdUpdate.Parameters.AddWithValue("@PL02", PL02)
                cmdUpdate.Parameters.AddWithValue("@PL03", PL03)
                cmdUpdate.Parameters.AddWithValue("@PL04", PL04)
                cmdUpdate.Parameters.AddWithValue("@PL05", PL05)
                cmdUpdate.Parameters.AddWithValue("@PL06", PL06)
                cmdUpdate.Parameters.AddWithValue("@PL07", PL07)
                cmdUpdate.Parameters.AddWithValue("@PL08", PL08)
                cmdUpdate.Parameters.AddWithValue("@PL09", PL09)
                cmdUpdate.Parameters.AddWithValue("@PL10", PL10)
                cmdUpdate.Parameters.AddWithValue("@PL11", PL11)
                cmdUpdate.Parameters.AddWithValue("@PL12", PL12)
                cmdUpdate.Parameters.AddWithValue("@PL13", PL13)
                cmdUpdate.Parameters.AddWithValue("@PL14", PL14)
                cmdUpdate.Parameters.AddWithValue("@PL15", PL15)
                cmdUpdate.Parameters.AddWithValue("@PL16", PL16)
                cmdUpdate.Parameters.AddWithValue("@PL17", PL17)
                cmdUpdate.Parameters.AddWithValue("@PL18", PL18)
                cmdUpdate.Parameters.AddWithValue("@PL19", PL19)
                cmdUpdate.Parameters.AddWithValue("@PL20", PL20)
                cmdUpdate.Parameters.AddWithValue("@PL21", PL21)
                cmdUpdate.Parameters.AddWithValue("@PL22", PL22)
                cmdUpdate.Parameters.AddWithValue("@PL23", PL23)
                cmdUpdate.Parameters.AddWithValue("@PL24", PL24)
                cmdUpdate.Parameters.AddWithValue("@PL25", PL25)
                cmdUpdate.Parameters.AddWithValue("@モデル連番", 進行連番)
                cmdUpdate.ExecuteNonQuery()
            End Using

            進行状況L.Text = $"進行連番 {進行連番}: [5/7] PLデータ更新完了"
            進行状況L.Refresh()
            Application.DoEvents()
        End Using
    End Sub

    ' ========================================
    ' 6. 容積01～25の更新
    ' ========================================
    Private Sub T600_更新6_容積(connStr As String)
        Using conn As New OleDbConnection(connStr)
            conn.Open()

            ' === 容積01～25の計算（GPLEランク×GPLIランク別） ===
            Dim 容積01 As Double = 0, 容積02 As Double = 0, 容積03 As Double = 0, 容積04 As Double = 0, 容積05 As Double = 0
            Dim 容積06 As Double = 0, 容積07 As Double = 0, 容積08 As Double = 0, 容積09 As Double = 0, 容積10 As Double = 0
            Dim 容積11 As Double = 0, 容積12 As Double = 0, 容積13 As Double = 0, 容積14 As Double = 0, 容積15 As Double = 0
            Dim 容積16 As Double = 0, 容積17 As Double = 0, 容積18 As Double = 0, 容積19 As Double = 0, 容積20 As Double = 0
            Dim 容積21 As Double = 0, 容積22 As Double = 0, 容積23 As Double = 0, 容積24 As Double = 0, 容積25 As Double = 0

            Dim sql容積 As String = "SELECT T500_計算対象.GPLEランク, T500_計算対象.GPLIランク, Sum(T500_計算対象.G容) AS G容の合計 FROM T500_計算対象 GROUP BY T500_計算対象.GPLEランク, T500_計算対象.GPLIランク;"
            Using cmd容積 As New OleDbCommand(sql容積, conn)
                Using reader容積 As OleDbDataReader = cmd容積.ExecuteReader()
                    While reader容積.Read()
                        If Not IsDBNull(reader容積("GPLEランク")) AndAlso Not IsDBNull(reader容積("GPLIランク")) AndAlso Not IsDBNull(reader容積("G容の合計")) Then
                            Dim GPLEランク As String = reader容積("GPLEランク").ToString()
                            Dim GPLIランク As String = reader容積("GPLIランク").ToString()
                            Dim 数 As Double = Convert.ToDouble(reader容積("G容の合計"))
                            Dim キー As String = GPLEランク & "_" & GPLIランク
                            Select Case キー
                                Case "GPLE_A1_GPLI_A1" : 容積01 = 数
                                Case "GPLE_A1_GPLI_A2" : 容積02 = 数
                                Case "GPLE_A1_GPLI_B" : 容積03 = 数
                                Case "GPLE_A1_GPLI_C" : 容積04 = 数
                                Case "GPLE_A1_GPLI_D" : 容積05 = 数
                                Case "GPLE_A2_GPLI_A1" : 容積06 = 数
                                Case "GPLE_A2_GPLI_A2" : 容積07 = 数
                                Case "GPLE_A2_GPLI_B" : 容積08 = 数
                                Case "GPLE_A2_GPLI_C" : 容積09 = 数
                                Case "GPLE_A2_GPLI_D" : 容積10 = 数
                                Case "GPLE_B_GPLI_A1" : 容積11 = 数
                                Case "GPLE_B_GPLI_A2" : 容積12 = 数
                                Case "GPLE_B_GPLI_B" : 容積13 = 数
                                Case "GPLE_B_GPLI_C" : 容積14 = 数
                                Case "GPLE_B_GPLI_D" : 容積15 = 数
                                Case "GPLE_C_GPLI_A1" : 容積16 = 数
                                Case "GPLE_C_GPLI_A2" : 容積17 = 数
                                Case "GPLE_C_GPLI_B" : 容積18 = 数
                                Case "GPLE_C_GPLI_C" : 容積19 = 数
                                Case "GPLE_C_GPLI_D" : 容積20 = 数
                                Case "GPLE_D_GPLI_A1" : 容積21 = 数
                                Case "GPLE_D_GPLI_A2" : 容積22 = 数
                                Case "GPLE_D_GPLI_B" : 容積23 = 数
                                Case "GPLE_D_GPLI_C" : 容積24 = 数
                                Case "GPLE_D_GPLI_D" : 容積25 = 数
                            End Select
                        End If
                    End While
                End Using
            End Using

            ' === T600_データモデルを更新（6: 容積01～25） ===
            Dim sqlUpdate As String = "UPDATE T600_データモデル SET " &
            "容積01 = @容積01, 容積02 = @容積02, 容積03 = @容積03, 容積04 = @容積04, 容積05 = @容積05, " &
            "容積06 = @容積06, 容積07 = @容積07, 容積08 = @容積08, 容積09 = @容積09, 容積10 = @容積10, " &
            "容積11 = @容積11, 容積12 = @容積12, 容積13 = @容積13, 容積14 = @容積14, 容積15 = @容積15, " &
            "容積16 = @容積16, 容積17 = @容積17, 容積18 = @容積18, 容積19 = @容積19, 容積20 = @容積20, " &
            "容積21 = @容積21, 容積22 = @容積22, 容積23 = @容積23, 容積24 = @容積24, 容積25 = @容積25 " &
            "WHERE モデル連番 = @モデル連番"

            Using cmdUpdate As New OleDbCommand(sqlUpdate, conn)
                cmdUpdate.Parameters.AddWithValue("@容積01", 容積01)
                cmdUpdate.Parameters.AddWithValue("@容積02", 容積02)
                cmdUpdate.Parameters.AddWithValue("@容積03", 容積03)
                cmdUpdate.Parameters.AddWithValue("@容積04", 容積04)
                cmdUpdate.Parameters.AddWithValue("@容積05", 容積05)
                cmdUpdate.Parameters.AddWithValue("@容積06", 容積06)
                cmdUpdate.Parameters.AddWithValue("@容積07", 容積07)
                cmdUpdate.Parameters.AddWithValue("@容積08", 容積08)
                cmdUpdate.Parameters.AddWithValue("@容積09", 容積09)
                cmdUpdate.Parameters.AddWithValue("@容積10", 容積10)
                cmdUpdate.Parameters.AddWithValue("@容積11", 容積11)
                cmdUpdate.Parameters.AddWithValue("@容積12", 容積12)
                cmdUpdate.Parameters.AddWithValue("@容積13", 容積13)
                cmdUpdate.Parameters.AddWithValue("@容積14", 容積14)
                cmdUpdate.Parameters.AddWithValue("@容積15", 容積15)
                cmdUpdate.Parameters.AddWithValue("@容積16", 容積16)
                cmdUpdate.Parameters.AddWithValue("@容積17", 容積17)
                cmdUpdate.Parameters.AddWithValue("@容積18", 容積18)
                cmdUpdate.Parameters.AddWithValue("@容積19", 容積19)
                cmdUpdate.Parameters.AddWithValue("@容積20", 容積20)
                cmdUpdate.Parameters.AddWithValue("@容積21", 容積21)
                cmdUpdate.Parameters.AddWithValue("@容積22", 容積22)
                cmdUpdate.Parameters.AddWithValue("@容積23", 容積23)
                cmdUpdate.Parameters.AddWithValue("@容積24", 容積24)
                cmdUpdate.Parameters.AddWithValue("@容積25", 容積25)
                cmdUpdate.Parameters.AddWithValue("@モデル連番", 進行連番)
                cmdUpdate.ExecuteNonQuery()
            End Using

            進行状況L.Text = $"進行連番 {進行連番}: [6/7] 容積データ更新完了"
            進行状況L.Refresh()
            Application.DoEvents()
        End Using
    End Sub

    ' ========================================
    ' 7. 重量01～25の更新
    ' ========================================
    Private Sub T600_更新7_重量(connStr As String)
        Using conn As New OleDbConnection(connStr)
            conn.Open()

            ' === 重量01～25の計算（GPLEランク×GPLIランク別） ===
            Dim 重量01 As Double = 0, 重量02 As Double = 0, 重量03 As Double = 0, 重量04 As Double = 0, 重量05 As Double = 0
            Dim 重量06 As Double = 0, 重量07 As Double = 0, 重量08 As Double = 0, 重量09 As Double = 0, 重量10 As Double = 0
            Dim 重量11 As Double = 0, 重量12 As Double = 0, 重量13 As Double = 0, 重量14 As Double = 0, 重量15 As Double = 0
            Dim 重量16 As Double = 0, 重量17 As Double = 0, 重量18 As Double = 0, 重量19 As Double = 0, 重量20 As Double = 0
            Dim 重量21 As Double = 0, 重量22 As Double = 0, 重量23 As Double = 0, 重量24 As Double = 0, 重量25 As Double = 0

            Dim sql重量 As String = "SELECT T500_計算対象.GPLEランク, T500_計算対象.GPLIランク, Sum(T500_計算対象.G重) AS G重の合計 FROM T500_計算対象 GROUP BY T500_計算対象.GPLEランク, T500_計算対象.GPLIランク;"
            Using cmd重量 As New OleDbCommand(sql重量, conn)
                Using reader重量 As OleDbDataReader = cmd重量.ExecuteReader()
                    While reader重量.Read()
                        If Not IsDBNull(reader重量("GPLEランク")) AndAlso Not IsDBNull(reader重量("GPLIランク")) AndAlso Not IsDBNull(reader重量("G重の合計")) Then
                            Dim GPLEランク As String = reader重量("GPLEランク").ToString()
                            Dim GPLIランク As String = reader重量("GPLIランク").ToString()
                            Dim 数 As Double = Convert.ToDouble(reader重量("G重の合計"))
                            Dim キー As String = GPLEランク & "_" & GPLIランク
                            Select Case キー
                                Case "GPLE_A1_GPLI_A1" : 重量01 = 数
                                Case "GPLE_A1_GPLI_A2" : 重量02 = 数
                                Case "GPLE_A1_GPLI_B" : 重量03 = 数
                                Case "GPLE_A1_GPLI_C" : 重量04 = 数
                                Case "GPLE_A1_GPLI_D" : 重量05 = 数
                                Case "GPLE_A2_GPLI_A1" : 重量06 = 数
                                Case "GPLE_A2_GPLI_A2" : 重量07 = 数
                                Case "GPLE_A2_GPLI_B" : 重量08 = 数
                                Case "GPLE_A2_GPLI_C" : 重量09 = 数
                                Case "GPLE_A2_GPLI_D" : 重量10 = 数
                                Case "GPLE_B_GPLI_A1" : 重量11 = 数
                                Case "GPLE_B_GPLI_A2" : 重量12 = 数
                                Case "GPLE_B_GPLI_B" : 重量13 = 数
                                Case "GPLE_B_GPLI_C" : 重量14 = 数
                                Case "GPLE_B_GPLI_D" : 重量15 = 数
                                Case "GPLE_C_GPLI_A1" : 重量16 = 数
                                Case "GPLE_C_GPLI_A2" : 重量17 = 数
                                Case "GPLE_C_GPLI_B" : 重量18 = 数
                                Case "GPLE_C_GPLI_C" : 重量19 = 数
                                Case "GPLE_C_GPLI_D" : 重量20 = 数
                                Case "GPLE_D_GPLI_A1" : 重量21 = 数
                                Case "GPLE_D_GPLI_A2" : 重量22 = 数
                                Case "GPLE_D_GPLI_B" : 重量23 = 数
                                Case "GPLE_D_GPLI_C" : 重量24 = 数
                                Case "GPLE_D_GPLI_D" : 重量25 = 数
                            End Select
                        End If
                    End While
                End Using
            End Using

            ' === T600_データモデルを更新（7: 重量01～25） ===
            Dim sqlUpdate As String = "UPDATE T600_データモデル SET " &
                "重量01 = @重量01, 重量02 = @重量02, 重量03 = @重量03, 重量04 = @重量04, 重量05 = @重量05, " &
                "重量06 = @重量06, 重量07 = @重量07, 重量08 = @重量08, 重量09 = @重量09, 重量10 = @重量10, " &
                "重量11 = @重量11, 重量12 = @重量12, 重量13 = @重量13, 重量14 = @重量14, 重量15 = @重量15, " &
                "重量16 = @重量16, 重量17 = @重量17, 重量18 = @重量18, 重量19 = @重量19, 重量20 = @重量20, " &
                "重量21 = @重量21, 重量22 = @重量22, 重量23 = @重量23, 重量24 = @重量24, 重量25 = @重量25 " &
                "WHERE モデル連番 = @モデル連番"

            Using cmdUpdate As New OleDbCommand(sqlUpdate, conn)
                cmdUpdate.Parameters.AddWithValue("@重量01", 重量01)
                cmdUpdate.Parameters.AddWithValue("@重量02", 重量02)
                cmdUpdate.Parameters.AddWithValue("@重量03", 重量03)
                cmdUpdate.Parameters.AddWithValue("@重量04", 重量04)
                cmdUpdate.Parameters.AddWithValue("@重量05", 重量05)
                cmdUpdate.Parameters.AddWithValue("@重量06", 重量06)
                cmdUpdate.Parameters.AddWithValue("@重量07", 重量07)
                cmdUpdate.Parameters.AddWithValue("@重量08", 重量08)
                cmdUpdate.Parameters.AddWithValue("@重量09", 重量09)
                cmdUpdate.Parameters.AddWithValue("@重量10", 重量10)
                cmdUpdate.Parameters.AddWithValue("@重量11", 重量11)
                cmdUpdate.Parameters.AddWithValue("@重量12", 重量12)
                cmdUpdate.Parameters.AddWithValue("@重量13", 重量13)
                cmdUpdate.Parameters.AddWithValue("@重量14", 重量14)
                cmdUpdate.Parameters.AddWithValue("@重量15", 重量15)
                cmdUpdate.Parameters.AddWithValue("@重量16", 重量16)
                cmdUpdate.Parameters.AddWithValue("@重量17", 重量17)
                cmdUpdate.Parameters.AddWithValue("@重量18", 重量18)
                cmdUpdate.Parameters.AddWithValue("@重量19", 重量19)
                cmdUpdate.Parameters.AddWithValue("@重量20", 重量20)
                cmdUpdate.Parameters.AddWithValue("@重量21", 重量21)
                cmdUpdate.Parameters.AddWithValue("@重量22", 重量22)
                cmdUpdate.Parameters.AddWithValue("@重量23", 重量23)
                cmdUpdate.Parameters.AddWithValue("@重量24", 重量24)
                cmdUpdate.Parameters.AddWithValue("@重量25", 重量25)
                cmdUpdate.Parameters.AddWithValue("@モデル連番", 進行連番)
                cmdUpdate.ExecuteNonQuery()
            End Using

            進行状況L.Text = $"進行連番 {進行連番}: [7/7] 重量データ更新完了"
            進行状況L.Refresh()
            Application.DoEvents()
        End Using
    End Sub

#End Region

    'df = pd.read_csv(r'パス\データモデル.csv', sep='\t', encoding='utf-8')

End Class